import axios, { AxiosInstance } from 'axios'
import { ElNotification, ElLoading } from 'element-plus'
import useStore from '@/store'
// import sign from '@/utils/sign'
// import { getRandomString } from '@/utils/util'
import { config as appConfig } from '@/app.config'

export class Http {
    public static request: AxiosInstance
    public static loading: any
    public static shadeNum: number = 0

    public static init() {
        // 创建axios实例
        this.request = axios.create({
            // baseURL: 'http://127.0.0.1:3007/api',  // 本地
            // baseURL: 'http://192.168.0.121:5173/api', // 家
            baseURL: 'http://192.168.43.153:5173/api', // nova7
            // baseURL: 'http://192.168.1.134:5173/api', // 公司
            timeout: appConfig.timeout || 10000
        })
        // 初始化拦截器
        this.initInterceptors();
        return axios;
    }

    public static initInterceptors() {
        // const authorization: string = 'Bearer ' + this.getToken()
        // 设置post请求头
        this.request.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
        // authorization && (this.request.defaults.headers.common['Authorization'] = authorization)
        /**
         * 请求拦截器
         * 每次请求前，如果存在token则在请求头中携带token
         */
        this.request.interceptors.request.use((config: any) => {
            const token = window.sessionStorage.getItem('token') || ''
            if (token) {
                config.headers.Authorization = 'Bearer ' + token; // 每个请求携带自定义 token
                // config.headers['Xsign'] = sign.getSign(config.url, config.method !== 'get' ? config.data : config.params);
                // config.headers['Xtimestamp'] = sign.getDateTimeToString();
            }
            // 遮罩
            let shade = config.shade === undefined ? true : config.shade;
            if (!!shade) {
                this.loading = ElLoading.service({
                    lock: true,
                    text: 'Loading...',
                    background: 'rgba(255, 255, 255, 0.4)'
                })
                this.shadeNum++
            }
            return config
        }, (error: any) => {
            console.log(error)
        })

         /**
         * 响应拦截器
         */
        this.request.interceptors.response.use((response: any) => {
            // 关闭遮罩
            let shade: any = response.config.shade
            this.closeLoading(shade)
            if (response.status === 200 && response.data && response.data.status == 0) {
                return response;
            } else {
                if(response.data && response.data.status != 0) {
                    // this.errorHandle(response.data)
                } else {
                    // this.errorHandle(response)
                }
                
                return response
            }
        }, (error: any) => {
            console.log('error', error)
            //const { layout } = useStore()
            let shade: any = error.config && error.config.shade
            this.closeLoading(shade)

            const { response } = error
            
            if (response) {
                // 请求已发出，但是不在2xx的范围
                if(response.data && response.data.status != 0) {
                    // this.errorHandle(response.data)
                } else {
                    // this.errorHandle(response)
                }
                return Promise.reject(response.data)
            } else {
                console.log('response2', response)
                // 处理断网的情况
                //layout.setShowAlert(true, error.message ?  error.message : 'The network connection is abnormal. Please try again later!')
            }
            return response
        })
    }
    /**
     * http握手错误
     * @param response 响应回调,根据不同响应进行不同操作
     */
    private static errorHandle(response: any) {
        // const { overallSe } = useStore()
        // 状态码判断
        switch (response.status) {
            case 401:
                // layout.setShowAlert(true, '401')
                console.log('401', response)
                break;
            case 403:
                console.log('403', response)
                break;
            case 404:
                console.log('The requested resource does not exist', response.data)
                break;
            case 500:
                if(response.message && response.message == '0001') {
                    // layout.notLogout()
                    // layout.setShowAlert(true, '')
                    console.log('500 0001', response)
                }
                break;
            default:
                console.log('连接错误', response.data)
                //layout.setShowAlert(true, response.data ?  (response.data.message || response.data.statusText) : 'Internal Server Error')
        }
    }

    public static closeLoading(shade: any) {
        shade = shade === undefined ? true : shade
        if (shade) {
            if (this.shadeNum > 0) {
                -- this.shadeNum
            }
            if (this.shadeNum === 0) {
                this.loading.close()
            }
        }
    }
    /**
     * 获取token
     */
    // public static getToken() {
    //     let _token: string = ''
    //     let userInfo: string = sessionStorage.getItem('userInfo') || ''
    //     if (userInfo) {
    //         _token = JSON.parse(userInfo).token || ''
    //     }
    //     return _token
    // }
}
// export class Http {
//     public static request: AxiosInstance
//     public static loading: any
//     public static shadeNum: number = 0

//     public static init() {
//         // 创建axios实例
//         this.request = axios.create({
//             baseURL: import.meta.env.VITE_BASE_URL,
//             timeout: appConfig.timeout || 10000
//         });
//         // 初始化拦截器
//         this.initInterceptors();
//         return axios;
//     }

//     public static initInterceptors() {
//         const language: string = localStorage.getItem('_i18') && localStorage.getItem('_i18')  == 'en' ? 'en' : 'tc'
//         const authorization: string = 'Bearer ' + this.getToken()
//         // 设置post请求头
//         this.request.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
//         this.request.defaults.headers.post['Content-Type'] = 'application/json';
//         this.request.defaults.headers.common['Arch6-Language'] = language;
//         authorization && (this.request.defaults.headers.common['Authorization'] = authorization)

//         /**
//          * 请求拦截器
//          * 每次请求前，如果存在token则在请求头中携带token
//          */
//         this.request.interceptors.request.use((config: any) => {
//             const token = window.sessionStorage.getItem('token') || ''
//             if(config.data && config.data.language) {
//                 const { layout } = useStore()
//                 config.data.language = layout.getLanguage == 'en' ? 'en' : 'tc'
//             }
//             if(config.data && !config.data.uid) {
//                 config.data.uid = getRandomString(20)
//             }
//             if (token) {
//                 config.headers['X-Access-Token'] = token; // 每个请求携带自定义 token
//                 config.headers['X-Sign'] = sign.getSign(config.url, config.method !== 'get' ? config.data : config.params);
//                 config.headers['X-TIMESTAMP'] = sign.getDateTimeToString();
//             }
//             // 遮罩
//             let shade = config.shade === undefined ? true : config.shade;
//             if (!!shade) {
//                 this.loading = ElLoading.service({
//                     lock: true,
//                     text: 'Loading...',
//                     background: 'rgba(255, 255, 255, 0.4)'
//                 })
//                 this.shadeNum++
//             }
//             return config
//         }, (error: any) => {
//             console.log(error)
//         })

//         /**
//          * 响应拦截器
//          */
//         this.request.interceptors.response.use((response: any) => {
//             // 关闭遮罩
//             let shade: any = response.config.shade
//             this.closeLoading(shade)

//             if (response.status === 200) {
//                 return response;
//             } else {
//                 this.errorHandle(response)
//                 return response;
//             }
//         }, (error: any) => {
//             console.log('error', error)
//             let shade: any = error.config && error.config.shade
//             this.closeLoading(shade)

//             const { response } = error
            
//             if (response) {
//                 // 请求已发出，但是不在2xx的范围
//                 this.errorHandle(response)
//                 return Promise.reject(response.data)
//             } else {
//                 // 处理断网的情况
//                 ElNotification({
//                     title: 'Tips',
//                     message: 'The network connection is abnormal. Please try again later!',
//                     type: 'error'
//                 })
//             }
//         })

//     }

//     /**
//      * http握手错误
//      * @param response 响应回调,根据不同响应进行不同操作
//      */
//     private static errorHandle(response: any) {
//         const { layout } = useStore()
//         // 状态码判断
//         switch (response.status) {
//             case 401:
//                 layout.setShowAlert(true)
//             break;
//             case 403:
//             break;
//             case 404:
//                 ElNotification({
//                     title: 'Tips',
//                     message: 'The requested resource does not exist',
//                     type: 'error'
//                 })
//             break;
//             default:
//                 console.log('连接错误', response.data)
//                 ElNotification({
//                     title: 'Tips',
//                     message: response.data ?  response.data.message || '连接错误' : '连接错误',
//                     type: 'error'
//                 })
//                 layout.setShowAlert(true)
//         }
//     }

//     public static closeLoading(shade: any) {
//         shade = shade === undefined ? true : shade
//         if (shade) {
//             if (this.shadeNum > 0) {
//                 -- this.shadeNum
//             }
//             if (this.shadeNum === 0) {
//                 this.loading.close()
//             }
//         }
//     }

//     /**
//      * 获取tpSessionId
//      */
//     public static getToken() {
//         let _token: string = ''
//         let user: string = sessionStorage.getItem('user') || ''
//         if (user) {
//             _token = JSON.parse(user).token || ''
//         }
//         return _token
//     }
// }